/**
 * 该文件是项目入口文件。
 *    1. 该文件是在 package.json 中指定的 main 选项
 *    2. 该文件是 electron 主进程
 *    3. 该文件运行在 Node 环境
 */

/**
 * 引入 app 与 BrowserWindow 两个模块
 *    - app，应用程序
 *    - BrowserWindow，用于创建与控制窗口的模块
 */
const { app, BrowserWindow, Menu } = require("electron");
const path = require("path");

/**
 * 创建窗口并渲染页面
 */
const createWindow = () => {
  // 实例化一个窗口对象
  const win = new BrowserWindow({
    width: 800,
    height: 600,
    webPreferences: {
      preload: path.join(__dirname, "./preload.js"),
    },
  });

  // 处理菜单
  //    1. 调用 Menu.buildFromTemplate() 静态方法基于模板的方式创建菜单实例
  //    2. 调用 Menu.setApplicationMenu() 设置应用程序的菜单
  const menu = Menu.buildFromTemplate([
    {
      label: "菜单一",
      submenu: [
        {
          label: "1-1",
          click: () => {
            console.log("1-1 被点击");
          },
        },
        {
          label: "1-2",
          click: () => {
            console.log("1-2 被点击");
          },
        },
      ],
    },
    {
      label: "菜单二",
    },
  ]);
  Menu.setApplicationMenu(menu);

  // 加载本地网页来渲染窗口
  win.loadFile("./index.html");

  // 加载在线网页
  // win.loadURL("https://www.baidu.com");

  // 默认打开开发者工具
  // win.webContents.openDevTools();
};

app.whenReady().then(() => {
  // 当 electron 应用准备就绪之后，在创建窗口
  createWindow();
  // 当系统是 MacOS 系统, 所有窗口关闭之后, 应用不会自动关闭, 会保留在 dock 中, 这时点击 dock 中的程序, 会发现一片空白 可以监听 app activate 事件,重新创建窗口
  app.on("activate", () => {
    /**
     * BrowserWindow.getAllWindows()
     *    该静态方法,返回当前通过 BrowserWindow 创建的所有窗口对象的数组
     */
    if (BrowserWindow.getAllWindows().length === 0) {
      createWindow();
    }
  });
});

/**
 * 监听所有窗口关闭事件
 */
app.on("window-all-closed", () => {
  //    通过 process.platform 来控制不同平台的逻辑
  //        - win32       windows 系统
  //        - darwin      MacOS 系统
  //        - linux       Linux 系统
  //        排除 MacOS 系统, 是因为 MacOS 不生效
  if (process.platform !== "darwin") {
    app.quit(); // 退出应用程序
  }
});
